home *** CD-ROM | disk | FTP | other *** search
- package sun.misc;
-
- public class FpUtils {
- static double twoToTheDoubleScaleUp = powerOfTwoD(512);
- static double twoToTheDoubleScaleDown = powerOfTwoD(-512);
-
- private FpUtils() {
- }
-
- public static int getExponent(double var0) {
- return (int)(((Double.doubleToRawLongBits(var0) & 9218868437227405312L) >> 52) - 1023L);
- }
-
- public static int getExponent(float var0) {
- return ((Float.floatToRawIntBits(var0) & 2139095040) >> 23) - 127;
- }
-
- static double powerOfTwoD(int var0) {
- assert var0 >= -1022 && var0 <= 1023;
-
- return Double.longBitsToDouble((long)var0 + 1023L << 52 & 9218868437227405312L);
- }
-
- static float powerOfTwoF(int var0) {
- assert var0 >= -126 && var0 <= 127;
-
- return Float.intBitsToFloat(var0 + 127 << 23 & 2139095040);
- }
-
- public static double rawCopySign(double var0, double var2) {
- return Double.longBitsToDouble(Double.doubleToRawLongBits(var2) & Long.MIN_VALUE | Double.doubleToRawLongBits(var0) & Long.MAX_VALUE);
- }
-
- public static float rawCopySign(float var0, float var1) {
- return Float.intBitsToFloat(Float.floatToRawIntBits(var1) & Integer.MIN_VALUE | Float.floatToRawIntBits(var0) & Integer.MAX_VALUE);
- }
-
- public static boolean isFinite(double var0) {
- return Math.abs(var0) <= Double.MAX_VALUE;
- }
-
- public static boolean isFinite(float var0) {
- return Math.abs(var0) <= Float.MAX_VALUE;
- }
-
- public static boolean isInfinite(double var0) {
- return Double.isInfinite(var0);
- }
-
- public static boolean isInfinite(float var0) {
- return Float.isInfinite(var0);
- }
-
- public static boolean isNaN(double var0) {
- return Double.isNaN(var0);
- }
-
- public static boolean isNaN(float var0) {
- return Float.isNaN(var0);
- }
-
- public static boolean isUnordered(double var0, double var2) {
- return isNaN(var0) || isNaN(var2);
- }
-
- public static boolean isUnordered(float var0, float var1) {
- return isNaN(var0) || isNaN(var1);
- }
-
- public static int ilogb(double var0) {
- int var2 = getExponent(var0);
- switch (var2) {
- case -1023:
- if (var0 == (double)0.0F) {
- return -268435456;
- } else {
- long var3 = Double.doubleToRawLongBits(var0);
- var3 &= 4503599627370495L;
-
- assert var3 != 0L;
-
- while(var3 < 4503599627370496L) {
- var3 *= 2L;
- --var2;
- }
-
- ++var2;
- if ($assertionsDisabled || var2 >= -1074 && var2 < -1022) {
- return var2;
- }
-
- throw new AssertionError();
- }
- case 1024:
- if (isNaN(var0)) {
- return 1073741824;
- }
-
- return 268435456;
- default:
- assert var2 >= -1022 && var2 <= 1023;
-
- return var2;
- }
- }
-
- public static int ilogb(float var0) {
- int var1 = getExponent(var0);
- switch (var1) {
- case -127:
- if (var0 == 0.0F) {
- return -268435456;
- } else {
- int var2 = Float.floatToRawIntBits(var0);
- var2 &= 8388607;
-
- assert var2 != 0;
-
- while(var2 < 8388608) {
- var2 *= 2;
- --var1;
- }
-
- ++var1;
- if ($assertionsDisabled || var1 >= -149 && var1 < -126) {
- return var1;
- }
-
- throw new AssertionError();
- }
- case 128:
- if (isNaN(var0)) {
- return 1073741824;
- }
-
- return 268435456;
- default:
- assert var1 >= -126 && var1 <= 127;
-
- return var1;
- }
- }
-
- public static double scalb(double var0, int var2) {
- int var4 = 0;
- short var5 = 0;
- double var6 = Double.NaN;
- if (var2 < 0) {
- var2 = Math.max(var2, -2099);
- var5 = -512;
- var6 = twoToTheDoubleScaleDown;
- } else {
- var2 = Math.min(var2, 2099);
- var5 = 512;
- var6 = twoToTheDoubleScaleUp;
- }
-
- int var8 = var2 >> 8 >>> 23;
- var4 = (var2 + var8 & 511) - var8;
- var0 *= powerOfTwoD(var4);
-
- for(int var11 = var2 - var4; var11 != 0; var11 -= var5) {
- var0 *= var6;
- }
-
- return var0;
- }
-
- public static float scalb(float var0, int var1) {
- var1 = Math.max(Math.min(var1, 278), -278);
- return (float)((double)var0 * powerOfTwoD(var1));
- }
-
- public static double nextAfter(double var0, double var2) {
- if (!isNaN(var0) && !isNaN(var2)) {
- if (var0 == var2) {
- return var2;
- } else {
- long var4 = Double.doubleToRawLongBits(var0 + (double)0.0F);
- if (var2 > var0) {
- var4 += var4 >= 0L ? 1L : -1L;
- } else {
- assert var2 < var0;
-
- if (var4 > 0L) {
- --var4;
- } else if (var4 < 0L) {
- ++var4;
- } else {
- var4 = -9223372036854775807L;
- }
- }
-
- return Double.longBitsToDouble(var4);
- }
- } else {
- return var0 + var2;
- }
- }
-
- public static float nextAfter(float var0, double var1) {
- if (!isNaN(var0) && !isNaN(var1)) {
- if ((double)var0 == var1) {
- return (float)var1;
- } else {
- int var3 = Float.floatToRawIntBits(var0 + 0.0F);
- if (var1 > (double)var0) {
- var3 += var3 >= 0 ? 1 : -1;
- } else {
- assert var1 < (double)var0;
-
- if (var3 > 0) {
- --var3;
- } else if (var3 < 0) {
- ++var3;
- } else {
- var3 = -2147483647;
- }
- }
-
- return Float.intBitsToFloat(var3);
- }
- } else {
- return var0 + (float)var1;
- }
- }
-
- public static double nextUp(double var0) {
- if (!isNaN(var0) && var0 != Double.POSITIVE_INFINITY) {
- var0 += (double)0.0F;
- return Double.longBitsToDouble(Double.doubleToRawLongBits(var0) + (var0 >= (double)0.0F ? 1L : -1L));
- } else {
- return var0;
- }
- }
-
- public static float nextUp(float var0) {
- if (!isNaN(var0) && var0 != Float.POSITIVE_INFINITY) {
- var0 += 0.0F;
- return Float.intBitsToFloat(Float.floatToRawIntBits(var0) + (var0 >= 0.0F ? 1 : -1));
- } else {
- return var0;
- }
- }
-
- public static double nextDown(double var0) {
- if (!isNaN(var0) && var0 != Double.NEGATIVE_INFINITY) {
- return var0 == (double)0.0F ? -Double.MIN_VALUE : Double.longBitsToDouble(Double.doubleToRawLongBits(var0) + (var0 > (double)0.0F ? -1L : 1L));
- } else {
- return var0;
- }
- }
-
- public static double nextDown(float var0) {
- if (!isNaN(var0) && var0 != Float.NEGATIVE_INFINITY) {
- return var0 == 0.0F ? (double)-Float.MIN_VALUE : (double)Float.intBitsToFloat(Float.floatToRawIntBits(var0) + (var0 > 0.0F ? -1 : 1));
- } else {
- return (double)var0;
- }
- }
-
- public static double copySign(double var0, double var2) {
- return rawCopySign(var0, isNaN(var2) ? (double)1.0F : var2);
- }
-
- public static float copySign(float var0, float var1) {
- return rawCopySign(var0, isNaN(var1) ? 1.0F : var1);
- }
-
- public static double ulp(double var0) {
- int var2 = getExponent(var0);
- switch (var2) {
- case -1023:
- return Double.MIN_VALUE;
- case 1024:
- return Math.abs(var0);
- default:
- assert var2 <= 1023 && var2 >= -1022;
-
- var2 -= 52;
- return var2 >= -1022 ? powerOfTwoD(var2) : Double.longBitsToDouble(1L << var2 - -1074);
- }
- }
-
- public static float ulp(float var0) {
- int var1 = getExponent(var0);
- switch (var1) {
- case -127:
- return Float.MIN_VALUE;
- case 128:
- return Math.abs(var0);
- default:
- assert var1 <= 127 && var1 >= -126;
-
- var1 -= 23;
- return var1 >= -126 ? powerOfTwoF(var1) : Float.intBitsToFloat(1 << var1 - -149);
- }
- }
-
- public static double signum(double var0) {
- return var0 != (double)0.0F && !isNaN(var0) ? copySign((double)1.0F, var0) : var0;
- }
-
- public static float signum(float var0) {
- return var0 != 0.0F && !isNaN(var0) ? copySign(1.0F, var0) : var0;
- }
- }
-